const path = require('path');
const fs = require('fs').promises;

const { resolveVue } = require('./utils');

const defaultExportRE = /((?:^|\n|;)\s*)export default/;

function pluginVue({ app, root }) {
    app.use(async (ctx, next) => {
        if (!ctx.path.endsWith('.vue')) {
            return next();
        }
        // .vue 文件路径处理
        const filePath = path.join(root, ctx.path);
        // 获取文件内容
        const content = await fs.readFile(filePath, 'utf8');
        
        // 获取文件内容 （拿到 @vue/compiler-sfc 来编译 .vue 的文件）
        const { parse, compileTemplate } = require(resolveVue(root).compiler);
        // 使用 @vue/compiler-sfc来编译 .vue 的文件
        const { descriptor } = parse(content); // 解析文件内容
        
        if (!ctx.query.type) {
            let code = ``;
            if (descriptor.script) {
                const content = descriptor.script.content;
                const replaced = content.replace(defaultExportRE, '$1const __script =');
                code += replaced;
            }
            if (descriptor.template) {
                const templateRequest = ctx.path + `?type=template`;
                code += `\nimport { render as __render } from ${JSON.stringify(templateRequest)}`;
                code += `\n__script.render = __render`;
            }
            code += `\nexport default __script`;
            ctx.type = 'js';

            ctx.body = code;
        }
        if (ctx.query.type == 'template') {
            ctx.type = 'js';
            const content = descriptor.template.content;
            // 将文件中的引入的模板再次解析
            const { code } = compileTemplate({ source: content });

            ctx.body = code;
        }
    })
}


module.exports = pluginVue;
